StayOnTop pres vsechny formulare
Otázka od: Daniel Frantik
1. 10. 2002 18:46
Dobry den,
potrebuji vytvorit formular, ktery bude navrchu uplne vzdy. Tento formular
ale neni hlavnim formem aplikace (a ani nechci, aby mel ikonu v liste).
V konferenci jsem nasel tato reseni reseni(ani jedno nefunguje na 100%)
1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top, Width, Height,
SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se mi to zda
2) Form.Activate ...
SetWindowLong(Handle, GWL_HWNDPARENT, 0);
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
Height, SWP_NOMOVE or SWP_NOSIZE);
//V podstate udela z meho formu hlavni form a pak to funguje - jenze pri
deaktivaci zmizi hlavni form a dostanu se na nej jen pokud ten svuj zavru
3) Udelat z tohoto formu ten hlavni ... (nic moc)
Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
invisible (s ikonou v Tray)
Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho formu dam [nil,
MainForm, Application]?
Diky za napady
Danik
Odpovedá: ing. Jan Fiala
2. 10. 2002 4:42
Nebylo by rozumnejsi, udelat to jako samostatnou aplikaci, ktera by s
tou hlavni komunikovala pomoci zprav ?
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
1.10.2002 Daniel Frantik:
> Dobry den,
> potrebuji vytvorit formular, ktery bude navrchu uplne vzdy. Tento formular
> ale neni hlavnim formem aplikace (a ani nechci, aby mel ikonu v liste).
> V konferenci jsem nasel tato reseni reseni(ani jedno nefunguje na 100%)
> 1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top, Width, Height,
> SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se mi to zda
> 2) Form.Activate ...
> SetWindowLong(Handle, GWL_HWNDPARENT, 0);
> SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
> Height, SWP_NOMOVE or SWP_NOSIZE);
> //V podstate udela z meho formu hlavni form a pak to funguje - jenze pri
> deaktivaci zmizi hlavni form a dostanu se na nej jen pokud ten svuj zavru
> 3) Udelat z tohoto formu ten hlavni ... (nic moc)
> Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
> invisible (s ikonou v Tray)
> Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho formu dam [nil,
> MainForm, Application]?
> Diky za napady
> Danik
Odpovedá: Daniel Frantik
2. 10. 2002 13:52
Take me to napadlo,
ale jedna se v podstate o stavovy hint te aplikace v tray. Tak mi
pripadalo delat na to dalsi 300kb exe trochu moc ....
Cele je to vlastne o tom, jak udelat maly zluty formular, ktery bude nekde
pripichnuty, zatimco aplikace je v tray ... (v praxi ji spis schovam v
taskbaru, mainform.hide a pridam, ikonu do tray ...)
Danik
PS: Zatim se mi podarilo pomoci varianty 2) dosahnout stavu, ze pokud je
"aplikace schovana v tray" tak je hintForm opravdu stayOnTop pres vsechno ve
Win. Jen jeste zustava na taskbaru (MainForm tam odkaz nema ...). Samozrejme
ze ShowWindow(Application.Handle, sw_hide); v tomto pripade (na hintForm)
nefunguje.
> Nebylo by rozumnejsi, udelat to jako samostatnou aplikaci, ktera by s
> tou hlavni komunikovala pomoci zprav ?
>
> --
> ing. Jan Fiala
>
> 1.10.2002 Daniel Frantik:
> > Dobry den,
> > potrebuji vytvorit formular, ktery bude navrchu uplne
> vzdy. Tento formular
> > ale neni hlavnim formem aplikace (a ani nechci, aby mel
> ikonu v liste).
> > V konferenci jsem nasel tato reseni reseni(ani jedno
> nefunguje na 100%)
>
> > 1)SetWindowPos(Form1.Handle, HWND_TOPMOST, Left, Top,
> Width, Height,
> > SWP_NOMOVE or SWP_NOSIZE); //- nedela nic - alespon se
> mi to zda
>
> > 2) Form.Activate ...
> > SetWindowLong(Handle, GWL_HWNDPARENT, 0);
>
> > SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
> > Height, SWP_NOMOVE or SWP_NOSIZE);
> > //V podstate udela z meho formu hlavni form a pak to
> funguje - jenze pri
> > deaktivaci zmizi hlavni form a dostanu se na nej jen pokud
> ten svuj zavru
>
> > 3) Udelat z tohoto formu ten hlavni ... (nic moc)
>
> > Celou situaci jeste trochu komplikuje to, ze hlavni form bude obcas
> > invisible (s ikonou v Tray)
> > Meni se neco pro "StayOnTop", pokud jako ownera vytvoreneho
> formu dam [nil,
> > MainForm, Application]?
>
>
> > Diky za napady
>
> > Danik
>
>
Odpovedá: Daniel Frantik
2. 10. 2002 13:38
Tak jsem to nakonec poskladal z ruznych rad z konference...
Jelikoz je to casty dotaz a v konferenci jsem ucelene reseni nenasel,
posilam pro INSPIRACI svuj kod.
MainForm je ten hlavni formular, HintForm je ten StayOnTop formular, co ma
byt videt pres vsechny formulare ve windows, kdyz se MainForm schova do tray
...
Pouzil jsem TrayIcon z RXLib (pro přidání ikony do tray)
Mozna jsou tam urcita volani zbytecna, ale je to vysledek laborovani ...
Danik
PS: diky vsem za rady.
//--------------------
procedure TMainForm.FormCreate(Sender: TObject);
begin
HintForm:=THintForm.Create(Self);
end;
procedure TMainForm.TrayIconDblClick(Sender: TObject);
begin
TrayIcon.Active:=False;
HintForm.Hide;
SetWindowLong(Handle, GWL_HWNDPARENT, 0); //Nastavi me jako hlavni form
aplikace
Show;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;
procedure TMainForm.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_SYSCOMMAND then //Nafixluji minimize jako hide a
ikonu do tray (jinak by se minimalizovaly vsechny okna aplikace)
if (Message.WParam and $FFF0) = SC_MINIMIZE then
begin
Hide;
TrayIcon.Active:=True;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
HintForm.Show;
Message.Result := 0;
end
else inherited
else inherited;
end;
//------------------------
procedure THintForm.FormActivate(Sender: TObject);
begin
if FormStyle = fsStayOnTop then
begin
SetWindowLong(Handle, GWL_HWNDPARENT , 0); //Prohlasi tento form za
Parent (asi jako main)
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width,
Height, SWP_NOMOVE or SWP_NOSIZE); //Nastavi StayOnTop
SetWindowLong(Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); // Schova ikonu
tohoto noveho "main" z taskbaru
end;
end;